import cv2
import numpy as np

# 创建 VideoCapture 对象，参数 0 表示默认摄像头
cap = cv2.VideoCapture(0)

# 设置分辨率
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)  # 设置帧宽度为 1920 像素
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)  # 设置帧高度为 1080 像素

# 检查摄像头是否成功打开
if not cap.isOpened():
    print("无法打开摄像头")
    exit()

# 创建窗口并设置大小
cv2.namedWindow('Camera', cv2.WINDOW_NORMAL)  # 创建可调整大小的窗口
cv2.resizeWindow('Camera', 1080, 1080)  # 设置窗口大小为 1080x1080

# 获取屏幕分辨率
screen_width = 1920  # 你可以根据你的实际屏幕分辨率进行调整
screen_height = 1080  # 你可以根据你的实际屏幕分辨率进行调整

# 计算窗口的位置，使其在屏幕中间显示
window_x = int((screen_width - 1080) / 2)
window_y = int((screen_height - 1080) / 2)

# 移动窗口到屏幕中间
cv2.moveWindow('Camera', window_x, window_y)

while True:
    # 捕获一帧
    ret, frame = cap.read()

    # 检查是否成功捕获帧
    if not ret:
        print("无法获取帧")
        break

    # 将 BGR 转换为 RGB
    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    # 裁剪或缩放帧到 1080x1080
    height, width, _ = frame_rgb.shape
    if width > height:  # 宽度大于高度，裁剪宽度
        crop_x = (width - height) // 2
        frame_resized = frame_rgb[:, crop_x:crop_x + height]
    else:  # 高度大于宽度或相等，裁剪高度
        crop_y = (height - width) // 2
        frame_resized = frame_rgb[crop_y:crop_y + width, :]

    # 确保输出为 1080x1080
    frame_resized = cv2.resize(frame_resized, (1080, 1080))

    # 在窗口中显示捕获的帧
    cv2.imshow('Camera', frame_resized)

    # 获取当前帧的分辨率
    print(f"当前帧分辨率: 1080 x 1080")

    # 按 'q' 键退出，按 'p' 键拍照
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
    elif key == ord('p'):
        # 保存当前帧为图片
        cv2.imwrite('captured_image.jpg', frame_resized)
        print(f"拍照成功！图片分辨率: 1080 x 1080")

# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()